<script setup lang="ts">
// 泛型  ----  类型的复用

type ObjType = {
  name: string;
  age: number;
  sex: boolean;
};
const obj: ObjType = {
  name: 'xxx',
  age: 123,
  sex: true,
};
console.log(obj);

// keyof 可以获取到 当前类型的 所有键 组成的联合类型
// 但是我们这个类型看不见， 类型是抽象的，在ts编译为js以后，所有的类型都消失了。
// type keysProps = keyof ObjType; // 结果  'name' | 'age' | 'sex'

// obj.name ===  string
// 因为函数的返回值不固定， 写ts函数的时候，返回值就写不了具体的类型，所以就要想到使用泛型变量去优化
// extends在泛型里面，表示约束的意思，  T extends object 表示 T必须是 object的子类型
function getValue<T extends object, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}
// T == ObjType
// K extends keyof T ===  K extends 'name' | 'age' |'sex'
getValue(obj, 'name'); // string
getValue(obj, 'age'); // number
getValue(obj, 'sex'); // boolean
</script>

<template>
  <a class="main">123</a>
</template>
